package com.zxl.study.confusion.v4;

import com.zxl.study.confusion.OrderDetailModel;
import com.zxl.study.confusion.OrderMainModel;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @auther zxl
 * @create 2023-08-13 15:52
 * 进行自动拆单的 职责对象
 */
public class SplitOrderHandler extends  SaveOrderHandler{
    @Override
    public void handleRequest(SaveOrderRequestModel saveOrderRequestModel) {
        //处理自己的业务

        if(saveOrderRequestModel.isAutoPayOk()){
            //6：自动进行拆单
//                    this.splitOrder(orderMainModel,orderDetailModelList);
            System.out.println("SplitOrderHandler=========>");
        }

        //最后一步，调用父类的方法，向后传递请求对象
        super.handleRequest(saveOrderRequestModel);
    }
    /**
     * 自动拆单的业务处理
     * @param orderMainModel
     * @param orderDetailModelList
     */
    //组合方法
    private  void splitOrder(OrderMainModel orderMainModel, List<OrderDetailModel> orderDetailModelList){
        Map<OrderMainModel,List<OrderDetailModel>> splitOrderMap = new HashMap<>();
        //6：自动进行拆单
        //这就要求在订单的数据结构上添加：订单 主子类型、所属的主订单的uuid
        //6.1：先按照税点进行拆单（税点可以是从前端传过来点，也可以后台重新到商品中心去获取）
        //拆分到结果，放在内存里面，先不要保存，等到最后完全拆单完成后，再一次性的批量保存
//        splitOrderMap = this.splitByTaxPoint(splitOrderMap);

        //6.2：获取客户配置的拆单规则
        //调用：CustomerCenter4OrderApi.getOrderSplitConfig

        //6.3：判断是否还需要继续拆分，如果需要
        if(true){
            //6.4：继续按照设置的规则进行拆分，（目前主要是按照会计科目进行拆单，会计科目数据从前端传过来）
//            this.splitByAccountingTitle(splitOrderMap);
//            this.splitByCustomerCategory(splitOrderMap);
        }

        //6.5：整体保存拆单的结果
//        this.saveSplitOrder(splitOrderMap);

        //6.6：记录订单操作日志，主子订单都一并记录下来
//        this.splitOrderLog(splitOrderMap);
    }

    /**
     * 按照税点进行拆单
     * @return
     */
    //功能方法
    private Map<OrderMainModel,List<OrderDetailModel>> splitByTaxPoint(Map<OrderMainModel,List<OrderDetailModel>> splitMap){

        return splitMap;
    }

    /**
     * 按照会计科目进行拆单
     * @param splitMap
     * @return
     */
    //功能方法
    private Map<OrderMainModel,List<OrderDetailModel>> splitByAccountingTitle(Map<OrderMainModel,List<OrderDetailModel>> splitMap){

        return splitMap;
    }
    /**
     * 按照客户自定义分类进行拆单
     * @param splitMap
     * @return
     */
    //功能方法
    private Map<OrderMainModel,List<OrderDetailModel>> splitByCustomerCategory(Map<OrderMainModel,List<OrderDetailModel>> splitMap){

        return splitMap;
    }

    /**
     * 整体保存拆单的结果
     * @param splitMap
     */
    //组合方法
    private void saveSplitOrder(Map<OrderMainModel,List<OrderDetailModel>> splitMap){
        //6.5.1：先批量保存主订单记录，获取返回结果，里面有对应的OrderMainUuid
//        List<OrderMainModel> list =  orderMainService.batchCreate();

        //6.5.2：循环设置相应的OrderDetailModel里面的OrderMainUuid
        //6.5.3：批量保存拆分出来的OrderDetail
//        this.saveOrderDetail(splitMap);
    }

    /**
     * 批量保存拆分出来的OrderDetail
     * @param splitMap
     */
    //功能方法
    private void saveSplitOrderDetail(Map<OrderMainModel, List<OrderDetailModel>> splitMap){
        //6.5.2：循环设置相应的OrderDetailModel里面的OrderMainUuid
        //6.5.3：批量保存拆分出来的OrderDetail

    }

    /**
     * 记录订单拆分后的操作日志，主子订单都要记录下来
     * @param splitMap
     */
    //功能方法
    private void splitOrderLog(Map<OrderMainModel,List<OrderDetailModel>> splitMap){
        //6.6：记录订单操作日志，主子订单都一并记录下来
    }
}